#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return x;
}
const int N=5e5+10;
struct ok{
    int x,y;
};
int n,m,q;
ll ans;
namespace sub{
    int fa[N],num[N];
    int bx[N][2],by[N][2];
    inline void Max(int &x,int y) {x=x>y?x:y;}
    inline void Min(int &x,int y) {x=x>y?y:x;}
    bool CK1(int l1,int r1,int l2,int r2)
    {
        if(l1>l2) swap(l1,l2),swap(r1,r2);
        // cerr<<"He "<<l1<<" "<<r1<<" "<<l2<<" "<<r2<<endl;
        return r1>=l2;
    }
    bool CK2(int x,int y)
    {
        return CK1(bx[x][0],bx[x][1],bx[y][0],bx[y][1])&&CK1(by[x][0],by[x][1],by[y][0],by[y][1]);
    }
    int Find(int x) {return x==fa[x]?x:fa[x]=Find(fa[x]);}
    void merge(int x,int y)
    {
        assert(x!=y);
        if(num[x]<num[y]) swap(x,y);
        Min(bx[x][0],bx[y][0]);
        Min(by[x][0],by[y][0]);
        Max(bx[x][1],bx[y][1]);
        Max(by[x][1],by[y][1]);
        fa[y]=x,num[x]+=num[y];
    }
    void solve()
    {
        for(int i=1,x,y,res;i<=q;i++)
        {
            x=read(),y=read();
            fa[i]=i,res=num[i]=1;
            for(int j=1;j<i;j++)
            {
                if(j!=Find(j)||!num[j]) continue;
                if(bx[j][0]<=x&&x<=bx[j][1]&&by[j][0]<=y&&y<=by[j][1]) {num[i]=0;goto L;}
            }
            bx[i][0]=bx[i][1]=x,by[i][0]=by[i][1]=y;
            for(int j=1;j<i;j++)
            {
                if(j!=Find(j)||!num[j]) continue;
                fa[i]=Find(i);
                int tx=1e9,ty=1e9;
                for(int k=0;k<2;k++)
                    for(int p=0;p<2;p++)
                        Min(tx,abs(bx[fa[i]][k]-bx[j][p])),
                        Min(ty,abs(by[fa[i]][k]-by[j][p]));
                // cerr<<i<<" "<<j<<" "<<CK2(fa[i],j)<<endl;
                if(tx+ty<=2||CK2(fa[i],j)) merge(fa[i],j);
            }
            L:;
        }
        // CK2(1,2);
        for(int i=1;i<=q;i++)
        {
            if(i!=Find(i)||!num[i]) continue;
            // cout<<bx[i][0]<<","<<by[i][0]<<" "<<bx[i][1]<<","<<by[i][1]<<endl;
            ans+=1ll*(bx[i][1]-bx[i][0]+1)*(by[i][1]-by[i][0]+1);
        }
        printf("%lld\n",ans);
    }
}
int C[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
vector<int>num[N];
bool check(int x,int y) {return 1<=x&&x<=n&&1<=y&&y<=m;}
void add(int x,int y)
{
    ++ans;
    num[x][y]=3;
    for(int i=0;i<4;i++)
    {
        int tx=x+C[i][0],ty=y+C[i][1];
        if(check(tx,ty)&&++num[tx][ty]==2) add(tx,ty);
    }
}
int main()
{
    freopen("grid.in","r",stdin);
    freopen("grid.out","w",stdout);
    n=read(),m=read(),q=read();
    if(1ll*n*m>1e7)
        return sub::solve(),0;
    for(int i=1;i<=n;i++) num[i].resize(m+5);
    int x,y;
    while(q--)
        x=read(),y=read(),add(x,y);
    printf("%lld\n",ans);
    return 0;
}